/**
  ******************************************************************
  * @file    main.c
  * @author  xy	
  * @version V1.0
  * @date    2020-9-29
  * @brief   定时器中断
  ******************************************************************
  * @attention
  * verimake 用于ch549例程
  * 使用定时器中断定时1s将小灯状态取反
  ******************************************************************
  */
#include <CH549_sdcc.H>	 //ch549的头文件，其中定义了单片机的一些特殊功能寄存器

#define led P2_2  //将单片机的P2.2端口定义为led


/********************************************************************
* TIPS:
* ch549定时器一共有四个分别为T0/T1/T2/Watch-Dog
* 此例程主要讨论T0/T1（定时器0/定时器1）
* 初始化一个定时器中断需要五步
* 第一步：设置定时器工作模式 模式0 TMOD=0x00 13 位定时/计数器
*                            模式1 TMOD=0x01 16 位定时/计数器
*                            模式2 TMOD=0x10 自动重载 8 位定时/计数器
* 第二步：设置定时器的初值，
*         注：1.默认设定下定时器T0/T1/T2/UART0/GPIOiFlashROM/iRAM/SFR使用的Fsys时钟信号为12MHz
*             2.T2MOD寄存器默认设定定时器T0/T1选标准时钟Fsys/12
*             3.因此计数器频率为1MHz，计数间隔为1us
*         举例 1ms的初值 1ms/1us=1000。也就是要计1000个数，初值=65535-1000+1（因为实际上计数器计数到66636才溢出）=64536=FC18H
*         设置	TH0=0XFC;//设置前八位为16进制的FC——11111100
*             	TL0=0X18;//设置后八位为16进制的OC——00011000
*              （定时器1同理）
* 第三步：打开定时器0或定时器1的中断允许 例：ET0=1 打开INT0的中断允许；ET0=0 关闭INT0的中断允许（定时器1同理）
* 第四步：打开总中断 例：EA=1 打开总中断；EA=0,关闭总中断
* 第五步：TCON里T0运行控制位
*         TR0置1时，T0开始工作；TR0置0时，T0停止工作。TR0由程序置1或清0，控制定时/计数器的启动与停止
*********************************************************************/

/********************************************************************
* 函 数 名         : Timer0Init
* 函数功能	       : 定时器0初始化
* 输    入         : 无
* 输    出         : 无
*************************************************** *****************/
void Timer0Init()
{
	TMOD|=0x01;//设置定时器工作模式为模式1 TMOD|=0x01等同于TMOD=TMOD|0x01 使用或控制符防止此处的设置对前面的设置造成影响
	//设置初值  目标为定时1ms 1ms/1us=1000。也就是要计数1000个数
	//初值=65535-1000+1（+1是因为实际上计数器计数到65536才溢出）=64536=FC18H
	TH0=0XFC;
	//设置前八位为16进制的FC——11111100
	TL0=0X18;
	//设置后八位为16进制的18——00011000
	ET0=1;//打开T0中断
	EA=1;//打开总中断
	TR0=1;//使得T0开始工作
}
/********************************************************************
* 函 数 名         : Timer1Init
* 函数功能		     : 定时器1初始化
* 输    入         : 无
* 输    出         : 无
*************************************************** *****************/
//void Timer1Init()
//{
//	TMOD|=0x01;//设置定时器工作模式为模式1 TMOD|=0x01等同于TMOD=TMOD|0x01 使用或控制符防止此处的设置对前面的设置造成影响。
//	//设置初值  目标为定时1ms 1ms/1us=1000。也就是要计数1000个数。
//	//初值=65535-1000+1（+1是因为实际上计数器计数到65536才溢出）=64536=FC18H
//	TH1=0XFC;
//设置前八位为16进制的FC——11111100
//	TL1=0X18;
//设置后八位为16进制的18——00011000
//	ET1=1;//打开T1中断
//	EA=1;//打开总中断
//	TR1=1;//使得T1开始工作
//}

/*******************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
********************************************************************/
void main()
{	
	Timer0Init();//定时器0初始化
	while(1);	   //死循环
}

/*******************************************************************
* 函 数 名         : Timer0()	__interrupt 1
* 函数功能		     : 定时器0的中断函数
* 输    入         : 无
* 输    出         : 无
* TIPS：1.Timer0 可以修改成任意函数名
*       2.举例：定时器1的中断函数 void Timer1()	__interrupt 3	
*       3.外部中断0       中断号0
*         定时器0中断     中断号1
*         外部中断1       中断号2
*         定时器1中断     中断号3
*******************************************************************/
void Timer0() __interrupt 1
{
    TH0=0XFC;	  
	TL0=0X18;
	//继续给定时器赋初值，定时1ms，初值为FC18H
	static int i;//设置局部变量 i
	i++;
	if(i==1000)//每进入一次中断则是1ms，1000次则是1s，此时将led状态取反即可达到实验目的。
	{
		i=0;
		led=!led;	//led状态取反
	}	
}